﻿// --------------------------------------------------------------------------------------------------------------------
// <copyright file="UsersController.cs" company="DTTB">
//   2011
// </copyright>
// <summary>
//   Defines the UsersController type.
// </summary>
// --------------------------------------------------------------------------------------------------------------------


using System;
using System.Collections.Generic;
using System.Web.Mvc;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.BussinessDelegate.PhanQuyen;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.Controllers.Base;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.FormBean.PhanQuyen;
using DTTB.Common;
using DTTB.DTO;
using Webdiyer.WebControls.Mvc;

namespace DTTB.MV2.QUANLYNHANSUTIENLUONG.Controllers
{
    public class UsersController : BaseController
    {
        UsersServiceDelegate UsersServiceDelegate = new UsersServiceDelegate();
        RolesServiceDelegate RolesServiceDelegate = new RolesServiceDelegate();
        DepartmentsServiceDelegate DepartmentsServiceDelegate = new DepartmentsServiceDelegate();
        JobTitlesServiceDelegate JobTitlesServiceDelegate = new JobTitlesServiceDelegate();
        UserInJobTitleInDepartmentServiceDelegate UserInJobTitleInDepartmentServiceDelegate = new UserInJobTitleInDepartmentServiceDelegate();
        
        private void BuildUsersForm(UsersForm form)
        {
            form.UserLoginID = Convert.ToInt32(Session["USERID"]); // lấy id của user login vào hệ thống

            //Lấy danh sách user không bị đánh dấu IsDelete = 1
            //form.UsersList = UsersServiceDelegate.GetAllUsers();

            form.GiaTriSearch = form.GiaTriSearch != null ? form.GiaTriSearch.Trim() : form.GiaTriSearch;
            //Lấy danh sách user không bị đánh dấu IsDelete = 1
            if (form.TieuChiSearch != 0 && !string.IsNullOrEmpty(form.GiaTriSearch)) // đang sử dụng chức năng search
            {
                form.UsersList = UsersServiceDelegate.SearchUsers(form.TieuChiSearch, form.GiaTriSearch);
            }
            else //không search
            {
                form.UsersList = UsersServiceDelegate.GetAllUsers();
            }
            


            //Khởi tạo SelectList cho User form
            UsersServiceDelegate.BuildSelectListForUsersForm(form);

            //Lấy danh sách các Chức vụ :
            form.JobTitlesList = JobTitlesServiceDelegate.GetAllEntities();

            //lấy danh sách các chức vụ đang kiêm cho user hiện hành
            form.UserInJobTitleInDepartmentList =
                UserInJobTitleInDepartmentServiceDelegate.GetUserInJobTitleInDepartmentByUserId(form.ID.ToString());

            foreach (var usersDto in form.UsersList)
            {   //lấy tên ngừoi tạo hay thay đổi thông tin User
                var userUpdate = UsersServiceDelegate.GetUsersById(Convert.ToString(usersDto.UpdateBy));
                var userCreate = UsersServiceDelegate.GetUsersById(Convert.ToString(usersDto.CreateBy));
                usersDto.UpdateByUser = usersDto.UpdateBy != 0 ? userUpdate.FullName : string.Empty;
                usersDto.CreateByUser = usersDto.CreateBy != 0 ? userCreate.FullName : string.Empty;
            }

            //Kiểm tra Cập nhật lại thông tin : user có role, có permission đặc biệt không
            this.UsersServiceDelegate.CheckUserRole(form.UsersList);
            this.UsersServiceDelegate.CheckSpecialPermission(form.UsersList);
        }

        //
        // GET: /Users/
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult List(int? id, string timKiem, string giaTri)
        {
            UsersForm form = new UsersForm();
            form.TieuChiSearch = Convert.ToInt32(timKiem);
            form.GiaTriSearch = giaTri;

            //Build danh sách users
            BuildUsersForm(form);
            form.ID = -1; //Dấu hiệu nhận biết tạo mới userd
            form.IsActive = true;

            //Phân trang
            form.UsersPagedList = new PagedList<UsersDto>(form.UsersList,id ?? 1,CommonVariables.PaggedItemsPerPage);


            return View("Create",form);
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult List(UsersForm form)
        {
            //Build danh sách users
            BuildUsersForm(form);
            form.ID = -1; //Dấu hiệu nhận biết tạo mới userd
            form.IsActive = true;
            form.ID = -1; //Dấu hiệu nhận biết tạo mới userd
            //Phân trang
            int? id = 1;
            form.UsersPagedList = new PagedList<UsersDto>(form.UsersList, id ?? 1, CommonVariables.PaggedItemsPerPage);


            return View("Create", form);
        }

        //lấy thông tin user gán cho Json phục vụ chức năng Edit users
        public JsonResult UsersEditAjax(string id)
        {
            var dto = this.UsersServiceDelegate.GetUsersById(id);

            if(dto.BirthDay == DateTime.MinValue)
            {
                dto.BirthDayIsNull = true;
            }

            //lấy các chức vụ đang kiêm cho nhân viên hiện hành
            IList<UserInJobTitleInDepartmentDto> UserInJobTitleInDepartmentDtoList = new List<UserInJobTitleInDepartmentDto>();
            UserInJobTitleInDepartmentDtoList = UserInJobTitleInDepartmentServiceDelegate.GetUserInJobTitleInDepartmentByUserId(id);

            if(UserInJobTitleInDepartmentDtoList.Count != 0)
            {
                dto.IdJobTitleList = new List<string>();
                foreach (var item in UserInJobTitleInDepartmentDtoList)
                {
                    dto.IdJobTitleList.Add(item.JobTitleId.ToString()); //danh sách các chức vụ đang kiêm của user
                }
            }
            
            return this.Json(dto, JsonRequestBehavior.AllowGet);
        }

        //kiểm tra user có tồn tại không
        public JsonResult IsExistUser(string userName)
        {
            var userDto = this.UsersServiceDelegate.GetUsersByUserName(userName);

            bool isExistUser = userDto != null ? true : false;

            return this.Json(isExistUser,JsonRequestBehavior.AllowGet);
        }

        [AcceptVerbs(HttpVerbs.Get)]
        [ValidateInput(false)]
        public ActionResult Create(int? id) //id : page number
        {
            return Redirect("~/Users/List/" + id);
        }


        //Tạo mới một User
        [AcceptVerbs(HttpVerbs.Post)]
        [ValidateInput(false)]
        public ActionResult Create(UsersForm form)
        {
            UsersDto newUsers = new UsersDto();

            //Lấy thông tin User mới từ Form
            newUsers = UsersServiceDelegate.BuildNewUser(form);
            
            //Lưu user mới xuống database
            int idUserReturn = -1;
            bool isCreateUsers = UsersServiceDelegate.AddNewUsers(newUsers, ref idUserReturn);

            form.ID = idUserReturn;
            form.UserID = idUserReturn.ToString();

            form.MessageCreateUser = isCreateUsers ? "Tạo mới thành công !" : "Tạo mới thất bại, xin thử lại !";


            //Lưu thông tin Chức vụ kiêm thêm của user vào bảng  TB_UserInJobTitleInDepartment.
            UserInJobTitleInDepartmentDto newUserInJobTitleInDepartmentDto = new UserInJobTitleInDepartmentDto();
            //newUserInJobTitleInDepartmentDto = UsersServiceDelegate.BuildNewUserInJobTitleInDepartment(form);

            if (form.ChucVuKiemString != null)
            {
                string[] idChucVuKiemList = form.ChucVuKiemString.Split('|');
                for (int i = 1; i < idChucVuKiemList.Length; i++)
                {
                    newUserInJobTitleInDepartmentDto.UserId = form.ID;
                    newUserInJobTitleInDepartmentDto.DepartmentId = form.Department; // hiện tại lưu department chính của nhân viên
                    newUserInJobTitleInDepartmentDto.JobTitleId = Convert.ToInt32(idChucVuKiemList[i]);
                    newUserInJobTitleInDepartmentDto.CreateDate = DateTime.Now;
                    newUserInJobTitleInDepartmentDto.UpdateDate = DateTime.Now;
                    newUserInJobTitleInDepartmentDto.CreateBy = Convert.ToInt32(Session["USERID"]);
                    newUserInJobTitleInDepartmentDto.UpdateBy = Convert.ToInt32(Session["USERID"]);
                    newUserInJobTitleInDepartmentDto.IsDelete = false;

                    UserInJobTitleInDepartmentServiceDelegate.AddNewEntity(newUserInJobTitleInDepartmentDto);
                }
            }

            //Refesh danh sách User
            BuildUsersForm(form);


            //Phân trang
            int id = 1;
            form.UsersPagedList = new PagedList<UsersDto>(form.UsersList, id, CommonVariables.PaggedItemsPerPage);

            //Get Id của user mới Save
            form.ID = UsersServiceDelegate.GetUsersByUserName(newUsers.UserName).ID;

            form.PasswordReadOnly = true;//khi đã tạo user, ko cho phép sửa username, pass trên màn hình tạo user
            form.UserNameReadOnly = true;//
            return View("Create", form);
        }

        [AcceptVerbs(HttpVerbs.Get)]
        [ValidateInput(false)]
        public ActionResult Edit(int? id) //id : page number
        {
            return Redirect("~/Users/List/" + id);
        }


        //Cập nhật thông tin một User
        [AcceptVerbs(HttpVerbs.Post)]
        [ValidateInput(false)]
        public ActionResult Edit(UsersForm form)
        {
            UsersDto editUsers = new UsersDto();

            //Lấy thông tin User mới từ Form
            editUsers = UsersServiceDelegate.BuildNewUserForEdit(form);

            //Get Id của user hiện hành(edit)
            //editUsers.ID = UsersServiceDelegate.GetUsersByUserName(form.UserName).ID;
            editUsers.ID = form.ID = Convert.ToInt32(form.UserID);
            
            //Lưu user mới xuống database
            
            bool isUpdateUsers =  UsersServiceDelegate.Update(editUsers);

            form.MessageEditUser = isUpdateUsers ? "Cập nhật thành công !" : "Cập nhật thất bại, xin thử lại !";
            
            //Xóa và Lưu Chức vụ kiêm thêm (mới Cập nhật) của nhân viên vào bảng  TB_UserInJobTitleInDepartment.

            UserInJobTitleInDepartmentServiceDelegate.DeleteUserInJobTitleInDepartmentByUserId(form.UserID); //Xóa mọi chức vụ nhân viên đang kiêm(để luu mới)

            if (form.ChucVuKiemString != null)
            {
                string[] idChucVuKiemList = form.ChucVuKiemString.Split('|');   
                UserInJobTitleInDepartmentDto newUserInJobTitleInDepartmentDto = new UserInJobTitleInDepartmentDto();
            
                for (int i = 1; i < idChucVuKiemList.Length; i++)
                {
                    newUserInJobTitleInDepartmentDto.UserId = Convert.ToInt32(form.UserID);
                    newUserInJobTitleInDepartmentDto.DepartmentId = form.Department; // hiện tại lưu department chính của nhân viên
                    newUserInJobTitleInDepartmentDto.JobTitleId = Convert.ToInt32(idChucVuKiemList[i]);
                    newUserInJobTitleInDepartmentDto.CreateDate = DateTime.Now;
                    newUserInJobTitleInDepartmentDto.UpdateDate = DateTime.Now;
                    newUserInJobTitleInDepartmentDto.CreateBy = Convert.ToInt32(Session["USERID"]);
                    newUserInJobTitleInDepartmentDto.UpdateBy = Convert.ToInt32(Session["USERID"]);
                    newUserInJobTitleInDepartmentDto.IsDelete = false;

                    UserInJobTitleInDepartmentServiceDelegate.AddNewEntity(newUserInJobTitleInDepartmentDto); //Lưu
                }
            }

            //Refesh danh sách User
            BuildUsersForm(form);
            form.ID = editUsers.ID;
            form.UserName = editUsers.UserName;
            //form.Password = editUsers.Password;

            //Phân trang
            int id = 1;
            form.UsersPagedList = new PagedList<UsersDto>(form.UsersList, id ,CommonVariables.PaggedItemsPerPage);


            form.PasswordReadOnly = true;//khi đã tạo user, ko cho phép sửa username, pass trên màn hình tạo user
            form.UserNameReadOnly = true;//

            return View("Create", form);
        }
        
        public ActionResult Delete(string userID)
        {
          UsersServiceDelegate.Delete(userID);
          return RedirectToAction("List");
        }

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult ChangePassword(int? id)//id : page number
        {
            return Redirect("~/Users/List/" + id);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult ChangePassword(UsersForm form)
        {
            UsersDto changePassUsers = new UsersDto();

            //Lấy thông tin password mới gán cho User  từ form
            changePassUsers = UsersServiceDelegate.BuildchangePassUsers(form);

            //Get Id của user hiện hành(edit)
            //editUsers.ID = UsersServiceDelegate.GetUsersByUserName(form.UserName).ID;
            changePassUsers.ID = Convert.ToInt32(form.UserID);


            //Lưu user mới xuống database : Thay đổi password của user
            
            bool isChangePass  = UsersServiceDelegate.Update(changePassUsers);

            form.MessageChangePassword = isChangePass ? "Mật khẩu thay đổi thành công !" : "Mật khẩu chưa được thay đổi, xin thử lại !";

            //Refesh danh sách User
            BuildUsersForm(form);
            form.ID = changePassUsers.ID;
            form.UserName = changePassUsers.UserName;
            //form.Password = changePassUsers.Password;
            //form.PasswordChange = changePassUsers.Password;
            //form.RePasswordChange = changePassUsers.Password;
            form.UserNameReadOnly = true;
            form.PasswordReadOnly = true;

            form.HidLastTab = 1;

            //Phân trang
            int id = 1;
            form.UsersPagedList = new PagedList<UsersDto>(form.UsersList, id, CommonVariables.PaggedItemsPerPage);

            return View("Create", form);
        }

        ////Quản lý User và roles
        //[AcceptVerbs(HttpVerbs.Get)]
        public ActionResult ManageUsersWithRoles(int? id, string timKiem, string giaTri)
        {
            UsersForm form = new UsersForm();
            form.TieuChiSearch = Convert.ToInt32(timKiem);
            form.GiaTriSearch = giaTri;

            //Build danh sách users
            BuildUsersForm(form);
            //Phân trang
            form.UsersPagedList = new PagedList<UsersDto>(form.UsersList, id ?? 1, CommonVariables.PaggedItemsPerPage);
            //lấy giá trị trang hiện hành
            form.CurrentPageNumber = id ?? 1;
            form.HidLastTab = 0;



            ////Mine
            ////Get all Paths in database

            //var dictionary = new Dictionary<string, object> { { "IsDelete", false } };
            form.PathsList = new List<PathsDto>();
            form.PathsList = this.UsersServiceDelegate.GetPaths();

            ////Get all PermissionsPerUsers by current userId in PermissionsPerUsers Table
            form.PermissonPerUsersByUserIdList = new List<PermissionsPerUsersDto>();
            
            if (form.UsersPagedList.Count != 0)
            {
                form.CurrentUsersId = form.UsersPagedList[0].ID.ToString();

                form.PermissonPerUsersByUserIdList = this.UsersServiceDelegate.GetPermissonPerUsersByUserId(form.CurrentUsersId);

                ////Build all Paths for 1 specifiable Roles from  RolesInPaths table:
                form.PathsForUserList = new List<PathsDto>();
                for (int i = 0; i < form.PermissonPerUsersByUserIdList.Count; i++)
                {
                    for (int j = 0; j < form.PathsList.Count; j++)
                    {
                        if (form.PermissonPerUsersByUserIdList[i].PathId == form.PathsList[j].ID)
                        {
                            form.PathsForUserList.Add(form.PathsList[j]);
                        }
                    }
                }

                //// Build DropDownList for Roles With User

                form.AvaiableRolesList = this.UsersServiceDelegate.BuildAvaiableRoleByUserList(form.CurrentUsersId);
                form.NotAssignedRolesList = this.UsersServiceDelegate.BuildRolesNotAssignedList(form.CurrentUsersId);
            }
            else
            {
                form.AvaiableRolesList = UsersServiceDelegate.BuildEmtySelectList();
                form.NotAssignedRolesList = UsersServiceDelegate.BuildEmtySelectList();
            }

            ////Get all Blocks in Application base on Paths table
            IList<object> blocksList = new List<object>();
            blocksList = this.UsersServiceDelegate.GetAllBlocksInPaths();
            form.Blocks = new List<string>();
            foreach (var block in blocksList)
            {
                form.Blocks.Add((string)block);
            }

            //Get all Module By block in Application base on Paths table
            form.ModulesByBlockArray = new IList<string>[form.Blocks.Count];
            int t = 0;
            foreach (string block in form.Blocks){
                
                IList<object> moduleListByBlockTemp = UsersServiceDelegate.GetAllModulesInPathsByBlocks(block); // lấy các Module theo Block

                IList<string> moduleListByBlock = new List<string>();

                foreach (var module in moduleListByBlockTemp)// chuyen list<object> sang list<string>
                {
                    moduleListByBlock.Add((string)module);
                }

                form.ModulesByBlockArray[t++] = moduleListByBlock; 
            }

            ////Get all Module in Application base on Paths table
            //IList<object> moduleList = new List<object>();
            //moduleList = this.UsersServiceDelegate.GetAllModuleInPaths();
            //form.Modules = new List<string>();
            //foreach (var module in moduleList)
            //{
            //    form.Modules.Add((string)module);
            //} // phần này đang dư (phần cũ)

            return View(form);
        }

        [AcceptVerbs(HttpVerbs.Get)]
        [ValidateInput(false)]
        public ActionResult ManageUsersWithRolesUpdate(int? id)
        {
            return Redirect("~/Users/ManageUsersWithRoles/" + id);
        }


        [AcceptVerbs(HttpVerbs.Post)]
        [ValidateInput(false)]
        public ActionResult ManageUsersWithRolesUpdate(UsersForm form)
        {
            //form.UserNameSearch = HttpUtility.HtmlEncode(form.UserNameSearch.Trim());

            //var dictionaryPaging = new Dictionary<string, object> { { "IsDelete", 0 } };
            //if (form.SearchFlag)
            //{
            //    dictionaryPaging.Add("UserName", form.UserNameSearch);
            //}

            //// default to page 1
            //var pageNo = form.PageNumber;

            //UsersForm formTemp = this.GetPagedFormWithSearchCriteria(pageNo, dictionaryPaging);

            //form.CustPage = formTemp.CustPage;
            //form.DtoList = formTemp.DtoList;
            //form.PageNumber = formTemp.PageNumber;
            //form.UsersList = form.DtoList;


 

            //if (form.SortFlag || form.UsersClickFlag)
            //{
            //    this.Sort(form.UsersList, form.PropertySort, form.Flag);
            //}

            //foreach (var user in form.DtoList)
            //{
            //    user.RoleExist = this.UsersServiceDelegate.CheckUserRoleForUser(user.ID.ToString());
            //    user.SpecialPermission = this.UsersServiceDelegate.CheckSpecialPermissionForUser(user.ID.ToString());
            //    this.UsersServiceDelegate.GetInfo(user);
            //}

            ////Get all Paths in database
            //var dictionary = new Dictionary<string, object> { { "IsDelete", false } };
            form.PathsList = new List<PathsDto>();
            form.PathsList = this.UsersServiceDelegate.GetPaths();

            ////Get all PermissionsPerUsers by current userId in PermissionsPerUsers Table
            form.PermissonPerUsersByUserIdList = new List<PermissionsPerUsersDto>();

            //if ((form.SearchOrPagingClickFlag || form.SearchFlag) && (form.UsersList.Count != 0))
            //{
            //    form.CurrentUsersId = form.UsersList[0].ID.ToString();
            //}

            //if (form.UsersClickFlag || form.UpdateFlag || form.UpdateRolesFlag)
            //{
                form.CurrentUsersId = form.CurrentUsersIdTemp;
            //}

            

            //Update Permissions riêng biệt cho User
            if (form.UpdatePermissionPerUserFlag)
            {
                try
                {
                    IList<PermissionsPerUsersDto> dtos = new List<PermissionsPerUsersDto>();


                    string[] newPermissionPerUserString = !string.IsNullOrEmpty(form.NewPermissionPerUserString) ? form.NewPermissionPerUserString.Split('|') : new string[0]; //// list of PathId
                    
                    for (int i = 1; i < newPermissionPerUserString.Length; i++)
                    {
                        if (!String.IsNullOrEmpty(newPermissionPerUserString[i]))
                        {
                            string[] modulePermissions = newPermissionPerUserString[i].Split('-');
                            //// query all Paths that has permissiontype and module as modulePermissions
                            
                            if (modulePermissions.Length == 2 && !String.IsNullOrEmpty(modulePermissions[0]) &&
                                !String.IsNullOrEmpty(modulePermissions[1]))
                            {
                                string module = modulePermissions[0].Trim();
                                string permissionType = modulePermissions[1].Trim();
                                IList<PathsDto> pathsDtos =
                                    this.RolesServiceDelegate.GetAllPathsByModulesAndPermissionType(module,
                                                                                                    permissionType);
                                foreach (PathsDto dto in pathsDtos)
                                {
                                    var permissionsPerUserDto = new PermissionsPerUsersDto();
                                    permissionsPerUserDto.UserId = Convert.ToInt32(form.CurrentUsersId);
                                    permissionsPerUserDto.PathId = dto.ID;
                                    permissionsPerUserDto.IsDelete = false;
                                    permissionsPerUserDto.CreateBy = Convert.ToInt32(Session["USERID"]);
                                    permissionsPerUserDto.UpdateBy = Convert.ToInt32(Session["USERID"]);
                                    permissionsPerUserDto.CreateDate = DateTime.Now;
                                    permissionsPerUserDto.UpdateDate = DateTime.Now;

                                    dtos.Add(permissionsPerUserDto);
                                }
                            }
                        }
                    }

                    this.UsersServiceDelegate.UpdatePermissonPerUsers(dtos, form.CurrentUsersId);

                    form.UpdateSatusMessage = "Cập nhật thành công !";

                    //// reGet all PermissionPerUser by current UserId at PermissionPerUser Table
                    //form.PermissonPerUsersByUserIdList = this.UsersServiceDelegate.GetPermissonPerUsersByUserId(form.CurrentUsersId);

                    ////reBuild all Paths for 1 specifiable User from  PermissionPerUser table:
                    //form.PathsForUserList = new List<PathsDto>();
                    //for (int i = 0; i < form.PermissonPerUsersByUserIdList.Count; i++)
                    //{
                    //    for (int j = 0; j < form.PathsList.Count; j++)
                    //    {
                    //        if (form.PermissonPerUsersByUserIdList[i].PathId == form.PathsList[j].ID)
                    //        {
                    //            form.PathsForUserList.Add(form.PathsList[j]);
                    //        }
                    //    }
                    //}

                    ////form.HidLastTab = 1;

                    //return View("ManageUsersWithRoles", form);
                }
                catch (Exception e)
                {
                    form.UpdateSatusMessage = "Cập nhật thất bại, xin thử lại !";
                    //return View("ManageUsersWithRoles", form);
                }
            }

            //Update roles cho user
            if (form.UpdateRolesFlag) 
            {
                //form.UserNameSearch = string.Empty;
                try
                {
                    IList<UsersInRolesDto> dtos = new List<UsersInRolesDto>();


                    //// list of new RolesId for User
                    
                    if(!string.IsNullOrEmpty(form.NewVailableRoleIdString)) // Nếu user không bị xóa hết role
                    {
                        string[] newRolesForUser = form.NewVailableRoleIdString.Split('|');
                        for (int i = 1; i < newRolesForUser.Length; i++)
                        {
                            var usersInRolesDto = new UsersInRolesDto();
                            usersInRolesDto.UserId = Convert.ToInt32(form.CurrentUsersId);
                            usersInRolesDto.RoleId = Convert.ToInt32(newRolesForUser[i]);
                            usersInRolesDto.IsDelete = false;
                            usersInRolesDto.CreateBy = Convert.ToInt32(Session["USERID"]);
                            usersInRolesDto.UpdateBy = Convert.ToInt32(Session["USERID"]);
                            usersInRolesDto.CreateDate = DateTime.Now;
                            usersInRolesDto.UpdateDate = DateTime.Now;

                            dtos.Add(usersInRolesDto);
                        }
                    }

                    this.UsersServiceDelegate.UpdateRolesPerUsers(dtos, form.CurrentUsersId);
                    form.UpdateRoleSatusMessage = "Cập nhật thành công !";

                    //// reBuild DropDownList for Roles With User

                    //form.AvaiableRolesList = this.UsersServiceDelegate.BuildAvaiableRoleByUserList(form.CurrentUsersId);
                    //form.NotAssignedRolesList = this.UsersServiceDelegate.BuildRolesNotAssignedList(form.CurrentUsersId);
                }
                catch (Exception e)
                {
                    form.UpdateRoleSatusMessage = "Cập nhật thất bại, xin thử lại !";
                    //return View("ManageUsersWithRoles", form);
                }
            }

            //me
            //Build danh sách users
            BuildUsersForm(form);
            //Phân trang
            //int id = 1;
            form.UsersPagedList = new PagedList<UsersDto>(form.UsersList, form.CurrentPageNumber, CommonVariables.PaggedItemsPerPage);
            //end

            form.PermissonPerUsersByUserIdList = this.UsersServiceDelegate.GetPermissonPerUsersByUserId(form.CurrentUsersId);

            //// Build DropDownList for Roles With User
            if (form.UsersList.Count != 0)
            {
                form.AvaiableRolesList = this.UsersServiceDelegate.BuildAvaiableRoleByUserList(form.CurrentUsersId);
                form.NotAssignedRolesList = this.UsersServiceDelegate.BuildRolesNotAssignedList(form.CurrentUsersId);
            }
            else
            {
                form.AvaiableRolesList = new SelectList(string.Empty, string.Empty);
                form.NotAssignedRolesList = new SelectList(string.Empty, string.Empty);
            }

            ////Build all Paths for 1 specifiable Roles from  RolesInPaths table:
            form.PathsForUserList = new List<PathsDto>();
            for (int i = 0; i < form.PermissonPerUsersByUserIdList.Count; i++)
            {
                for (int j = 0; j < form.PathsList.Count; j++)
                {
                    if (form.PermissonPerUsersByUserIdList[i].PathId == form.PathsList[j].ID)
                    {
                        form.PathsForUserList.Add(form.PathsList[j]);
                    }
                }
            }

            ////Get all Blocks in Application base on Paths table
            IList<object> blocksList = new List<object>();
            blocksList = this.UsersServiceDelegate.GetAllBlocksInPaths();
            form.Blocks = new List<string>();
            foreach (var block in blocksList)
            {
                form.Blocks.Add((string)block);
            }

            //Get all Module By block in Application base on Paths table
            form.ModulesByBlockArray = new IList<string>[form.Blocks.Count];
            int t = 0;
            foreach (string block in form.Blocks)
            {

                IList<object> moduleListByBlockTemp = UsersServiceDelegate.GetAllModulesInPathsByBlocks(block); // lấy các Module theo Block

                IList<string> moduleListByBlock = new List<string>();

                foreach (var module in moduleListByBlockTemp)// chuyen list<object> sang list<string>
                {
                    moduleListByBlock.Add((string)module);
                }

                form.ModulesByBlockArray[t++] = moduleListByBlock;
            }

            ////Get all Module in Application base on Paths table
            //IList<object> moduleList = new List<object>();
            //moduleList = this.UsersServiceDelegate.GetAllModuleInPaths();
            //form.Modules = new List<string>();
            //foreach (var module in moduleList)
            //{
            //    form.Modules.Add((string)module);
            //} //Phần cũ

            

            return View("ManageUsersWithRoles", form);
        }

    }
}
